<?php

/**
 * Clase FotoMapper (Singleton)
 * Gestiona el acceso a la Base de Datos
 * del modulo de Fotos.
 * version 3
 */
require_once($_SESSION['dir'] . '/fotos/DataBase.php');

class FotoMapper {

    private static $instance;

    /**
     * Para evitar que instancien esta clase, se crea un constructor privado
     * (Tomado del manual de php:
     *             http://php.net/manual/en/language.oop5.patterns.php)
     */
    private function __construct() {
        
    }

    /**
     * Evita que los usuarios clonen el objeto
     * (Tomado del manual de php:
     *             http://php.net/manual/en/language.oop5.patterns.php)
     */
    public function __clone() {
        trigger_error('No se permite la clonación de este objeto.', E_USER_ERROR);
    }

    /**
     * Método que garantiza que sólo habrá una instancia de esta clase, con los
     * dos métodos anteriores junto con este, se crea un "Singleton Pattern"
     * con lo cual emulamos lo que sería una clase estática (lo que en java
     * hacemos con "public static class blah {}").
     * (Tomado del manual de php:
     *             http://php.net/manual/en/language.oop5.patterns.php)
     */
    public static function getInstance() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }

    /**
     * Función que guarda una Foto en la BD
     * devuelve el id de la foto, o -1 si existe algun error. 
     * @param string $idalbum
     * @param string $nombreFoto
     * @param string $imagen
     * @return int $idFoto
     */
    public function saveFoto($idalbum, $nombreFoto, $imagen, $tam, $tipo) {
        DataBase::getInstance();
        $idfoto = 0;

        // Crear el Muro de la foto
        $id_muro =Muro::Crear_Muro("40");

        // Agregar Album en la tabla Album de la BD
        $sqlQuery = "INSERT INTO pinf.foto(album, nombre, imagen,tam,formato,idMuro) VALUES" .
                "('$idalbum','$nombreFoto','$imagen','$tam','$tipo',$id_muro)";

        $queryResult = mysql_query($sqlQuery);
        // Si falló la operacion retornar -1
        // sino, guardar el ultimo id generado para la foto
        if ($queryResult == FALSE) {
            return -1;
        } else {
            $idFoto = mysql_insert_id();
        }
        RETURN $idFoto;
    }

    public function borrarFoto($ID_Foto) {
        DataBase::getInstance();
        $sqlQuery = "DELETE FROM pinf.foto WHERE id=$ID_Foto";
        $queryResult = mysql_query($sqlQuery);
    }

    /**
     * Función que determina si existe una Foto cuyo nombre es $nombre_foto
     * dentro de un Album cuyo ID es $id_album.
     * Devuelve TRUE si existe el Album, FALSE si no existe
     * y -1 si existió algun error. 
     * @param string $nombre_foto
     * @param string $id_album
     * @return boolean 
     */
    public function existeFotoAlbum($nombre_foto, $id_album) {
        DataBase::getInstance();
        $sqlQuery = "SELECT *
                   FROM pinf.Foto
                   WHERE album='$id_album' AND nombre='$nombre_foto'";
        $queryResult = mysql_query($sqlQuery);

        if (!($queryResult)) {
            RETURN 3;
        }

        $row = mysql_fetch_assoc($queryResult);

        if (!($row)) {
            return 2;
        } else {
            return 1;
        }
    }

    /**
     * Función que devuelve un array que contiene los ID de las fotos
     * de un Album cuyo ID es $ID_album.
     * Devuelve NULL si existió algun error.
     * @param int $ID_album
     * @return array() 
     */
    public function getIdsFotoAlbum($ID_album) {
        DataBase::getInstance();
        $sqlQuery = "SELECT ID FROM pinf.foto
                    WHERE album='$ID_album'";
        $queryResult = mysql_query($sqlQuery);
        if (!$queryResult) {
            RETURN NULL;
        }
        $idsFotos = array();
        while ($row = mysql_fetch_array($queryResult, MYSQL_ASSOC)) {
            $idsFotos[] = $row["ID"];
        }
        RETURN $idsFotos;
    }

    public function getPersonas($id_foto) {
        DataBase::getInstance();
        $sqlQuery = "SELECT persona FROM pinf.persona_foto WHERE IDFoto='$id_foto' 
                        AND IDPerfil IS NULL union 
                    (SELECT IDPerfil FROM pinf.persona_foto WHERE IDFoto='$id_foto'
                        AND persona IS NULL)" 
        ;
        $queryResult = mysql_query($sqlQuery);       
        if (!$queryResult) {
            RETURN NULL;
        }
        $nombres = array();
        while(($row = mysql_fetch_array($queryResult, MYSQL_ASSOC))) {
            $nombres[] = $row["persona"];
        }
        RETURN $nombres;
    }

    /**
     * Función que recibe un id $id_foto de foto y devuelve un arreglo 
     * con el nombre y la imagen asociados con ese $id_foto.
     * Devuelve NULL si existio algun error o no existe el $id.
     * @param int $id_foto
     * @return array() 
     */
    public function getNombreImagenFoto($id_foto) {
        DataBase::getInstance();
        $sqlQuery = "SELECT nombre, imagen, tam ,formato FROM pinf.Foto
                    WHERE ID='$id_foto'";
        $queryResult = mysql_query($sqlQuery);
        if (!$queryResult) {
            RETURN NULL;
        }
        if (!($row = mysql_fetch_array($queryResult))) {
            RETURN NULL;
        }
        RETURN $row;
    }

    /**
     * Función que recibe un $id de una foto y devuelve el id del Muro de la foto 
     * asociado con ese $id.
     * Devuelve NULL si existio algun error o no existe el $id.
     * @param int $id
     * @return int 
     */
    public function getMuroFoto($id) {
        DataBase::getInstance();
        $sqlQuery = "SELECT idMuro FROM pinf.foto
                    WHERE ID='$id'";
        $queryResult = mysql_query($sqlQuery);
        if (!$queryResult) {
            RETURN NULL;
        }
        if (!($row = mysql_fetch_row($queryResult))) {
            RETURN NULL;
        }
        RETURN $row[0];
    }

    public function getImagenFoto($id_foto) {
        DataBase::getInstance();
        $sqlQuery = "SELECT imagen FROM pinf.Foto
                    WHERE ID='$id_foto'";
        $queryResult = mysql_query($sqlQuery);
        if (!$queryResult) {
            RETURN NULL;
        }
        if (!($row = mysql_fetch_row($queryResult))) {
            RETURN NULL;
        }
        RETURN $row[0];
    }

    /**
     * Funcion que guarda la relacion entre una persona o Perfil con una foto
     * Si la persona especificada existe en la red se asocia a su perfil
     * Devuelve el entero 3 si existio algun error
     * Devuelve el entero 2 si se insertaron los datos correctamente
     * @param type $persona
     * @param type $id_foto
     * @return int
     */
    public function savePersonaFoto($id_foto, $persona) {
        DataBase::getInstance();
        $sqlQuery = "SELECT usrname FROM pinf.perfil WHERE usrname='$persona'";
        $queryResult = mysql_query($sqlQuery);
        // Si existio algun error devolver 3
        if (!($queryResult)) {
            RETURN 3;
        }

        $row = mysql_fetch_assoc($queryResult);
        if (!($row)) {
            // Si no existe el usrname en la tabla perfil
            $sqlQuery = "INSERT INTO pinf.Persona_Foto (Persona,IDPerfil,IDFoto) VALUES 
                        ('$persona',NULL,$id_foto)";
            $queryResult = mysql_query($sqlQuery);

            if (!($queryResult)) {
                RETURN 3;
            } else {
                // Si existe el usrname en la tabla perfil
                $sqlQuery = "INSERT INTO pinf.Persona_Foto (Persona,IDPerfil,IDFoto) VALUES 
                        (NULL,'$persona',$id_foto)";
                $queryResult = mysql_query($sqlQuery);
                if (!($queryResult)) {
                    RETURN 3;
                }
                RETURN 2;
            }
        }
    }
}

?>
